﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace KaartenLib
{
    public class Kaart:IComparable,ICloneable
    {
        Types _type;
        Waarden _waarde;
        Boolean _zichtbaar;

        public Kaart(Types type, Waarden waarde)
        {       
            this.Type = type;
            this.Waarde = waarde;
        }

        public Types Type
        {
            get
            {
                return this._type;
            }

            private set
            {
                if (!Enum.IsDefined(typeof(Types), value))
                {
                    throw new DomainException("Type mag niet null zijn");
                }

                this._type = value;
            }
        }

        public override string ToString()
        {
            return Type + " " + Waarde;
        }

        public Waarden Waarde
        {
            get
            {
                return this._waarde;
            }

            private set
            {
                /*
                if (!Enum.IsDefined(typeof(Waarden), value) )
                {
                    throw new DomainException("Waarde mag niet null zijn");
                }*/

                this._waarde = value;
            }
        }

        public Boolean Zichtbaar
        {
            get
            {
                return this._zichtbaar;
            }

            set
            {
                this._zichtbaar = value;
            }
        }

        public object Clone()
        {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();

            bf.Serialize(ms, this);
            ms.Position = 0;

            Object obj = bf.Deserialize(ms);
            ms.Close();

            return obj;
        }

        public int CompareTo(object obj)
        {
            int terug = 1;
            if (obj != null)
            {
                if (getKaartIndex(this) == getKaartIndex((Kaart)obj))
                {
                    terug = 0;
                }
                else if(getKaartIndex(this) < getKaartIndex((Kaart)obj))
                {
                    terug = -1;
                }
            }
            return terug;
        }

        private int getKaartIndex(KaartenLib.Kaart Kaart)
        {
            int type;
                if (Kaart.Type.Equals(KaartenLib.Types.Harten))
                {
                    type = 0;
                }
                else if (Kaart.Type.Equals(KaartenLib.Types.Klaveren))
                {
                    type = 1;
                }
                else if (Kaart.Type.Equals(KaartenLib.Types.Ruiten))
                {
                    type = 2;
                }
                else
                {
                    type = 3;
                }
                type = 13 * type + (int)((KaartenLib.Waarden)Enum.Parse(typeof(KaartenLib.Waarden), Kaart.Waarde.ToString())) - 1;
            return type;
        }
    }
}
